home *** CD-ROM | disk | FTP | other *** search
/ Aminet 3 / Aminet 3 - July 1994.iso / Aminet / util / misc / MUser17bin.lha / MultiUser / MultiUser.doc < prev    next >
Encoding:
Text File  |  1994-03-07  |  64.8 KB  |  1,672 lines

  1.  
  2.                                                                  
  3.                    / / / /                                       
  4.                   / / / /
  5.             \ \ \ \/ / /      -+*+- MultiUser Release 1.7 -+*+-
  6.              \ \/\ \/ /                                          
  7.               \ \/\ \/                                           
  8.  
  9.  
  10.  
  11. DISCLAIMER
  12.  
  13. WITH  THIS  DOCUMENT  I  MAKE  NO  WARRANTIES  OR  REPRESENTATIONS,  EITHER
  14. EXPRESSED  OR  IMPLIED,  WITH RESPECT TO THE PRODUCT DESCRIBED HEREIN.  THE
  15. INFORMATION  PRESENTED  HEREIN IS BEING SUPPLIED ON AN 'AS IS' BASIS AND IS
  16. EXPRESSLY  SUBJECT TO CHANGE WITHOUT NOTICE.  THE ENTIRE RISK AS TO THE USE
  17. OF  THIS  INFORMATION IS ASSUMED BY THE USER.  IN NO EVENT WILL I BE LIABLE
  18. FOR  DIRECT,  INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES RESULTING FROM
  19. ANY  CLAIM  ARISING OUT OF THE INFORMATION PRESENTED HEREIN, EVEN IF I HAVE
  20. BEEN ADVISED OF THE POSSIBILITIES OF SUCH DAMAGES.
  21.  
  22.  
  23. COPYRIGHT
  24.  
  25.   This  package is shareware.  This means you can copy it freely as long as
  26. you  don't  ask any money for it, except perhaps a nominal fee for copying.
  27. If  you  like  and use this package on a regular base, I'd appreciate it if
  28. you  send  me a contribution of 500 BEF or USD 15 (or the equivalent in any
  29. other  solid  currency).   Please  send money by International Money Order,
  30. EuroCheck  (in BEF!) or Cash, because it's very difficult for me to cash in
  31. other checks.
  32.  
  33.   This  package  should not be spread in any other form than an LhA archive
  34. and  all  parts  of  it  should be spread together.  The package may not be
  35. altered  in  any way and cannot be used for commercial purposes without the
  36. prior  written permission of the author.  This does not apply to the source
  37. of  the  support  commands, they are full public domain, only the copyright
  38. message should be preserved.
  39.  
  40.   The  package is Copyright © Geert Uytterhoeven, All Rights Reserved.  The
  41. author  reserves the right to change the status of this package whenever he
  42. may find it appropriate.
  43.  
  44.   The rules above do not apply to the external utilities, for which I don't
  45. give  any  warranties.   Read the appropriate documentation for information
  46. about their disclaimers, distributability and copyright notices.
  47.  
  48.  
  49. CONTENTS
  50.  
  51.   Introduction
  52.   System Requirements
  53.   Installation
  54.   The password file
  55.   The configuration file
  56.   The group file
  57.   Support Commands
  58.   The log file
  59.   Caveats
  60.   External utilities
  61.   Other software supporting MultiUser
  62.   History
  63.   Plans for the future
  64.   Credits
  65.   Contacts
  66.   Special thanks go to ...
  67.  
  68.  
  69.  
  70. 1. Introduction
  71.  
  72.   You've  got an Amiga with Kickstart 2.04 or higher and several people are
  73. regularly  fooling  around  with it ...  Last week your sister deleted your
  74. 20MB JPEG collection by mistake and you don't want this to happen again ...
  75. Well, here's the answer:  MultiUser!
  76.  
  77.   MultiUser allows you to create a *IX-like environment where several users
  78. live  together  in  harmony,  unable to delete each others files, unable to
  79. read  those  private  love-letters  of  other  users  ...  And this even if
  80. several  users  are  working on the machine at the same time (on a terminal
  81. hooked up to the serial port) ...
  82.  
  83.   You  are  the  sole user of your computer?  Well, make sure it stays that
  84. way  by installing MultiUser!  People without a valid login ID and password
  85. won't be able to access files you have made private with MultiUser.  If you
  86. make  all  files  private  (not readable for others), the only useful thing
  87. they could do, is boot from a floppy ...
  88.  
  89.   And ...  you do not have to reformat your hard drive!
  90.  
  91.  
  92.  
  93. 2. System Requirements
  94.  
  95.   Your  Amiga  should be equipped with Kickstart 2.04 (V37+) or higher, and
  96. with  a  hard drive/controller combination that supports the CBM Rigid Disk
  97. Block  protocol (e.g.  an A590 or A2091, an A3000 SCSI controller, an A4000
  98. IDE  controller  and most GVP SCSI controllers).  MultiUser can not be used
  99. on  floppy drive systems in a sensible way (keeping your floppies in a safe
  100. place is still safer :-).
  101.  
  102.   You  do  need an original FastFileSystem (V36.102 (release 2.04), V36.104
  103. (release  2.05 or 2.1), V39.27 (release 3.0) or V40.1 (release 3.1)), which
  104. should have been included with your system software.
  105.  
  106.   The  package was written on an A4000/040 running Kickstart 39.106 and was
  107. tested on the following configurations:
  108.  
  109.   o A4000/040,  540  MB  Conner  CP30544  (a  VERY  fast IDE!) + 120 MB IDE
  110.     harddisk, 2 MB chip ram, 8 MB fast ram
  111.  
  112.   o A4000/040,  120  MB  IDE harddisk, 2 MB chip ram, 8 MB fast ram, Retina
  113.     graphics board, Retina WB emulation
  114.  
  115.   o A3000T  25MHz,  500+  MB  harddisk,  2  MB chip ram and 16 MB fast ram,
  116.     Kickstart  37.175,  GVP  '040  accel,  Retina graphics board, Retina WB
  117.     emulation,  Vortex  486  SLC  board  (this  is  shit!), Amax II+, IV-24
  118.     graphics board,...  (Not mine :-( A demonstration model in a store Kurt
  119.     frequently visits :^)
  120.  
  121.   o A3000  25MHz, 52 MB + 120 MB harddisk, 2 MB chip ram and some MB static
  122.     column ram.  Kickstart 39.110 (developer)
  123.  
  124.   o A500,  20 MB harddisk (A590 XT), 512 K chip ram, 512 K ranger mem, 2 MB
  125.     fast  ram,  old  chipset,  68010  processor,  Kickstart 2.04 softkicked
  126.     (developer)
  127.  
  128.   o A500,  84  or 105 MB harddisk (A590 SCSI), 512 K chip ram, 512 K ranger
  129.     mem, 2 MB fast ram, old chipset, Kickstart 2.04 softkicked (developer)
  130.  
  131.  
  132.   On all these configuration the package seems to work fine, so I guess you
  133. can run it on almost any machine.
  134.  
  135.   You  do  need  the  reqtools.library  version  38 or higher.  Reqtools is
  136. Copyright © Nico François.
  137.  
  138.  
  139.  
  140. 3. Installation
  141.  
  142.   WARNING:   Read the installation part completely BEFORE you apply it!  If
  143. you  still don't know what we're talking about, you'd better don't use this
  144. package!   It's  NOT  for the casual user; managing a MultiUser system is a
  145. difficult and tedious task!
  146.   If  anything  fails during the installation, don't forget to restore your
  147. system  to  it's  original state, else you could be surprised in a very bad
  148. way!
  149.   If  you're  upgrading  from  release  1.4  or  1.3 (or even from an older
  150. version), please read 'MultiUser.upgrade' first.
  151.  
  152.   o Extract  the  archive and change the current directory to the directory
  153.     MultiUser  located in the directory where you extracted the archive to.
  154.     (Preferably RAM:)
  155.  
  156.   o Install  the  library  and  the  support  commands  with  the following
  157.     commands:
  158.  
  159.                        Copy Libs/multiuser.library LIBS:
  160.                        Copy C/#?                   C:
  161.  
  162.   o The  MultiUserFileSystem  is  distributed  as  a patch for the original
  163.     FastFileSystem.   There  are patches for the FastFileSystems of release
  164.     2.04  (V36.102), release 2.05 (V36.104), release 2.1 (V36.104), release
  165.     3.0  (V39.27)  and  release  3.1 (V40.1) of the operating system.  Make
  166.     sure  you  have  one of these FastFileSystems in the L:  directory!  If
  167.     it's not there you can copy it from the L directory on the Install disk
  168.     of the operating system install disk set.  If you're not sure about the
  169.     version    of    your   FastFileSystem   use   the   command   'Version
  170.     L:FastFileSystem'.  Now Create a MultiUserFileSystem with the command:
  171.  
  172.                      Patch/spatch -oL:MultiUserFileSystem
  173.              -pPatch/MultiUserFileSystem_xxx.pch L:FastFileSystem
  174.  
  175.     where  xxx  stands for '2.04', '2.05', '2.1', '3.0' or '3.1', depending
  176.     on your operating system release.
  177.  
  178.     If you get the message
  179.  
  180.                       Incorrect version of original file.
  181.  
  182.     you  used  the  wrong  patchfile or you have an original FastFileSystem
  183.     which  is  not  supported  (or  your  original  FastFileSystem has been
  184.     corrupted).
  185.  
  186.     Spatch is © Copyright SAS Institute, Inc., but freely distributable.
  187.  
  188.   o Choose  the  partitions you want to protect and the directory where you
  189.     want  to  store  the  MultiUser  configuration  stuff.   Make sure this
  190.     directory  is  located  on  one  of the partitions you want to protect!
  191.     Let's  say  your  configuration  directory  is 'App:MultiUser' (Replace
  192.     'App:MultiUser'   anywhere  in  this  document  by  the  name  of  your
  193.     configuration  directory  if you use another directory name).  Copy the
  194.     configuration stuff to this directory with the following command:
  195.  
  196.                          Copy Config/#? App:MultiUser
  197.  
  198.   o If  you've  installed  the  TCP/IP  package  from Commodore (AS225) you
  199.     already  have  a  valid  password  file  (inet:db/passwd).  The inet:db
  200.     directory must be located on one of the partitions you want to protect!
  201.     Make  sure there's an entry for a 'root' user with '65535' for the user
  202.     and primary group number, e.g.:
  203.  
  204.     root||65535|65535|The Bastard Operator From Hell|SYS:Homes/Root|cli
  205.           ^^^^^ ^^^^^
  206.  
  207.   o Append the next line to your 'S:User-Startup' file:
  208.  
  209.                                Logout GUI GLOBAL
  210.  
  211.   o Pick  a  name  for  your  computer  ...   This  name will appear in the
  212.     login/logout  requester.   Let's  say  you  want  to  call  your system
  213.     'Pythagoras', then you have to execute the following:
  214.  
  215.                       Echo "Pythagoras" >ENVARC:HostName
  216.  
  217.   o Let's  say  you  want to protect the partitions 'SYS:' and 'App:'.  You
  218.     can  protect as many partitions as you like, just add their name to the
  219.     list  below.  Create the required Keyfiles on these partitions with the
  220.     following  command  if  you  haven't  installed the TCP/IP package from
  221.     Commodore:
  222.  
  223.               MakeKeyfiles App:MultiUser App:MultiUser SYS: App:
  224.  
  225.     TCP/IP users should use a command line like this:
  226.  
  227.                  MakeKeyfiles inet:db App:MultiUser SYS: App:
  228.  
  229.   o Start  HDToolBox to install the MultiUserFileSystem.  If HDToolBox does
  230.     not  find your hard drive, you probably have to start it from the shell
  231.     with  'HDToolBox  <hddev>',  where  <hddev> stands for the name of your
  232.     hard  drive  controller device (e.g.  'scsi.device' for CBM controllers
  233.     or 'gvpscsi.device' for GVP controllers).  If that fails too, you can't
  234.     use MultiUser on your system.
  235.  
  236.       NOTE: The  following  text  describes  the  use  of  the  version  of
  237.             HDToolBox  that  is  supplied  with AmigaOS Release 3.0.  Other
  238.             versions may slightly differ.
  239.  
  240.       x Choose  the drive you want to protect.  If you want to protect more
  241.         than  one  drive,  you  simply  repeat this for each of the drives.
  242.         Select  the  drive  by  clicking  on  it  in the listview where all
  243.         connected drives are displayed.
  244.  
  245.       x Press  the  <Partition  Drive>  button.   Now  a new display should
  246.         appear  containing a large box which may be divided up into several
  247.         partitions ...
  248.  
  249.       x Activate  the  <Advanced  Options>  checkbox.   Now some additional
  250.         options should appear ...
  251.  
  252.       x Press  the <Add/Update...> button in the file system section of the
  253.         HDToolBox    window.     (There's    only    one   gadget   labeled
  254.         <Add/Update...>, so you can't miss it.)
  255.  
  256.       x Now  the  window  should contain a list of currently installed file
  257.         systems  and  some  additional  buttons.   If you are updating your
  258.         MultiUserFileSystem,  there  should  already  be  an entry with the
  259.         0x6d754653  ('muFS' in HEX ASCII) identifier.  If this is the case,
  260.         click  on it and press <Update File System...>, in all other cases,
  261.         press the <Add New File System...> button.
  262.  
  263.       x Now  a  requester  appears.   Enter  'L:MultiUserFileSystem' in the
  264.         string-gadget  of  the requester and '0x6d754653' in the identifier
  265.         (also  called  DosType)  gadget.  If your version of HDToolBox asks
  266.         you to enter a version number, you should use 39.  Some versions of
  267.         HDToolbox  (the  one  with  3.0) uses two requesters for the needed
  268.         information,  so  it  may be necessary to select the <Ok> button of
  269.         the requester before you can fill in the DosType.
  270.  
  271.       x Press  the  <Ok>  button of the requester (if you haven't done this
  272.         yet).  Now you should be back in the File Systems display.  Go back
  273.         to the Partitions display by pressing the <Ok> button.
  274.  
  275.       x Select  the  partition on the drive that you wanna protect.  If you
  276.         want  to  protect  more  than  one  partition (it is recommended to
  277.         protect  all  partitions  on  the  drive),  you  simply  repeat the
  278.         following  stuff  for  every  partition.  You select a partition by
  279.         clicking  on  the  part  of  the  large  box (which represents your
  280.         harddisk) that represents that partition.
  281.  
  282.       x Press the <Change ...> or <Change File System> button.
  283.  
  284.       x Select  the  <Custom  File  System>  gadget  and enter '0x6d754653'
  285.         ('muFS' in HEX ASCII) into the <Identifier> gadget.
  286.  
  287.       x Press  the  <Ok>  button  to return to the Partitions display.  You
  288.         should  repeat  the  above steps for all the partitions you wish to
  289.         protect before continuing ...
  290.  
  291.       x Press the <Ok> button to return to the main HDToolBox display.
  292.  
  293.       x Press  the  <Save  Changes  to Drive> button.  Don't care about the
  294.         warning  that this will destroy the data on your partition, no data
  295.         will  be  lost :-).  If HDToolBox complains that there isn't enough
  296.         space  on  the drive to save all the configuration data, you should
  297.         return  to  the  File  System  Maintenance  section of HDToolBox by
  298.         pressing  <Partition  Drive> and <Add/Update ...> buttons.  Now you
  299.         should  select  another  file  system  than the one with identifier
  300.         0x6d754653,   press  <Delete  File  System>,  return  to  the  main
  301.         HDToolBox  display  and  try  saving the configuration again.  Note
  302.         that  you  should  make  sure  not to delete any file system that's
  303.         still  used  on  any partition!  This is why it is recommended that
  304.         all partitions on the drive should use the MultiUserFileSystem.
  305.  
  306.       x If  everything  went OK, select Exit and confirm the reboot request
  307.         of HDToolBox.  Now your machine should automatically reset.
  308.  
  309.   o After  the  reboot,  a requester should appear.  Simply enter 'root' as
  310.     login  id.   You  should now be logged in as root, having access to all
  311.     files.
  312.  
  313.   o The first thing you should do is to change your password.  This is done
  314.     by  entering  the  Passwd  GUI  command in a shell you open or with the
  315.     <Execute  Command  ...>  option  of the Workbench.  You are prompted to
  316.     enter  your  old password, so simply press enter.  Now you are asked to
  317.     enter  your  new password twice.  If you enter the same password twice,
  318.     this  will from now on (until you change it again) be the password root
  319.     has to enter at a login request.
  320.  
  321.   o Now  you  have  to  protect some important files using the MProtect and
  322.     SetOwner[37]  commands.   We will use SetOwner in this description, but
  323.     if  you  aren't  using  Kickstart  39.xx  or  higher,  you  should  use
  324.     SetOwner37 instead!
  325.     You  should  protect the Keyfiles on all protected partitions.  Execute
  326.     the following commands for every protected partition:
  327.  
  328.                SetOwner <VOL>.MultiUser.keyfile root
  329.                MProtect <VOL>.MultiUser.keyfile R
  330.  
  331.     where  <VOL> stands for a partition name (e.g.  'SYS:' or 'App:' in our
  332.     example).  Protect some other important files, too:
  333.  
  334.              SetOwner App:MultiUser/passwd root
  335.              MProtect App:MultiUser/passwd RWD
  336.              SetOwner App:MultiUser/MultiUser.config root
  337.              MProtect App:MultiUser/MultiUser.config RWD
  338.              SetOwner App:MultiUser/MultiUser.group root
  339.              MProtect App:MultiUser/MultiUser.group RWD
  340.              SetOwner App:MultiUser/.profile root
  341.              MProtect App:MultiUser/.profile SRWED GROUP R OTHER R
  342.              SetOwner S:Startup-Sequence root
  343.              MProtect S:Startup-Sequence SRWED GROUP R OTHER R
  344.              SetOwner S:User-Startup root
  345.              MProtect S:User-Startup SRWED GROUP R OTHER R
  346.              SetOwner SYS:Tools/HDToolBox root
  347.              MProtect SYS:Tools/HDToolBox RWED
  348.  
  349.                 ... and any other files you wish to protect ...
  350.  
  351.     It  is  recommended  to leave most files readable for others, except of
  352.     course  the  files  you really wanna keep to yourself.  .info files and
  353.     .backdrop  files  should  be  readable  for everybody if you don't want
  354.     complications when using the Workbench.
  355.  
  356.   o Do  NOT  forget  to  make a backup of all Keyfiles, in case an accident
  357.     occurs!
  358.  
  359.   o If  you  think  you  may  ever  forget  your  root  password, create an
  360.     emergency boot disk using the procedure mentioned in 'Emergency.doc' in
  361.     the 'Emergency' directory.  If you don't I hope your strong memory will
  362.     never leave you!
  363.  
  364.  
  365.  
  366. 4. The password file
  367.  
  368.   The  password  file  contains all the information the system needs on the
  369. users  that  are  allowed to access the system.  This file (named 'passwd')
  370. must  be  located  in  the  PASSWDDIR  directory,  as  specified  with  the
  371. 'MakeKeyFiles'  command.  Each line of the file contains information on one
  372. user.  The syntax of such a line is as follows:
  373.  
  374.       <userid>'|'<passwd>'|'<uid>'|'<gid>'|'<name>'|'<home>'|'<port>
  375.  
  376. <userid>  is  the  same  as the name this user will need to give at a login
  377.           request.  This name may be upto 31 characters long.
  378.  
  379. <passwd>  if  the  user has a password, this is his coded password.  If you
  380.           add  new  users, you should make this field empty, this means the
  381.           user  doesn't  have  a password yet.  Then login as that user and
  382.           change his password using the Passwd command.
  383.  
  384. <uid>     is  the user identifier, a number between 1 and 65535.  Each user
  385.           should have a different user identifier!  The identifier 65535 is
  386.           reserved for root!
  387.  
  388. <gid>     is  the  primary  group identifier, a number between 0 and 65535.
  389.           Users with the same group identifier belong to the same group and
  390.           can  access  each  others files depending on the group-protection
  391.           bits.   Users  with  different  group identifiers can access each
  392.           others   files  depending  on  the  other-protection  bits.   The
  393.           identifier  65535  is  reserved for root!  For users belonging to
  394.           more than one group, see the group file section.
  395.  
  396. <name>    is  the  real  name of the user.  You can enter whatever you like
  397.           for this.  At the moment this is limited to 219 characters.  This
  398.           name  is  displayed  when  user  information  is  asked using the
  399.           UserInfo command.
  400.  
  401. <home>    is the home-directory of the user.  When a logout is performed, a
  402.           requester  will appear prompting for a new login.  If a user logs
  403.           in using this requester, the current directory will be changed to
  404.           the  home  of  this  user and the local environment variable HOME
  405.           will  be  set  to  the  name of the home-directory.  This doesn't
  406.           happen when a Login command is used.
  407.  
  408. <port>    is  only  used  by the TCP/IP package from Commodore (AS225).  If
  409.           you  haven't  installed  that package you should leave this field
  410.           empty.
  411.  
  412.   A passwd file could look like this:
  413.  
  414.     root||65535|65535|The Bastard Operator From Hell|SYS:Homes/Root|cli
  415.     geert|Fqhg_IYBiU`|2|1|Geert Uytterhoeven|SYS:Homes/Geert|cli
  416.     kurt|fNXjuAgFBFF|3|2|Kurt Haenen|SYS:Homes/Kurt|cli
  417.     guest||1|0|Anonymous Guest|SYS:Homes/Guest|cli
  418.  
  419.   If there are bad lines in the password file, a warning will be posted and
  420. the  bad  line  will  be  ignored.   The  warning  requester will disappear
  421. automatically after 10 seconds if the user doesn't respond.
  422.  
  423.  
  424.  
  425. 5. The configuration file
  426.  
  427.   The   configuration   file  defines  some  settings.   This  file  (named
  428. 'MultiUser.config')   must  be  located  in  the  CONFIGDIR  directory,  as
  429. specified  with the 'MakeKeyFiles' command.  It contains lines with options
  430. and  values  - in the form <OPTION>=<VALUE> -, and comments.  Comments must
  431. be  preceeded with a semicolon.  If an option is missing, the default value
  432. will be taken.  0 is used for OFF, 1 for ON.
  433.   The  'MultiUser.config'  example  delivered with the package reflects the
  434. default settings.
  435.   If  there  are  bad  options in the configuration file, a warning will be
  436. posted  and  the  bad  line  will  be  ignored.  The warning requester will
  437. disappear automatically after 10 seconds if the user doesn't respond.
  438.  
  439.  
  440. 5.1. LIMITDOSSETPROTECTION
  441.  
  442.   If this options is turned on, the protection bits for GROUP and OTHER can
  443. no  longer be changed with the dos.library/SetProtection() call.  Of course
  444. you  can  still  change  the  protection  bits for GROUP and OTHER with the
  445. MProtect  command  (or with the library call muSetProtection()).  It's very
  446. useful because a lot of programs change the protection bits without knowing
  447. about  bits  for  GROUP  and  OTHER.  Defaults to ON.  See also the support
  448. command LimitDOSSetProtection.
  449.  
  450.  
  451. 5.2. PROFILE
  452.  
  453.   If  this option is turned on and there exists a script file '.profile' in
  454. the configuration directory, it will be executed after each login prompt by
  455. the support command Logout.  Defaults to ON.
  456.   The   '.profile'   example   delivered   with   the  package  displays  a
  457. 'Message_Of_The_Day'  if  it  exists in the configuration directory (change
  458. the  directory  in  the  '.profile'  if  you have a different configuration
  459. directory  than  'App:MultiUser') and executes a '.profile' if it exists in
  460. the user's home-directory.
  461.  
  462.  
  463. 5.3. LASTLOGINREQ
  464.  
  465.   If  this  option  is  turned  on, there will appear a lastlogin requester
  466. after each graphical login.  Defaults to ON.
  467.  
  468.  
  469. 5.4. LOGSTARTUP
  470.  
  471.   If  this  option  is  turned on, every startup or reinitialisation of the
  472. MultiUser.server  will  be  logged  to  the  file  'MultiUser.log'  in  the
  473. configuration directory.  Defaults to OFF.
  474.  
  475.  
  476. 5.5. LOGLOGIN
  477.  
  478.   If this option is turned on, every successful login will be logged to the
  479. file 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  480.  
  481.  
  482. 5.6. LOGLOGINFAIL
  483.  
  484.   If  this  option is turned on, every unsuccessful login will be logged to
  485. the file 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  486.  
  487.  
  488. 5.7. LOGPASSWD
  489.  
  490.   If  this  option  is  turned on, every successful password change will be
  491. logged   to  the  file  'MultiUser.log'  in  the  configuration  directory.
  492. Defaults to OFF.
  493.  
  494.  
  495. 5.8. LOGPASSWDFAIL
  496.  
  497.   If  this  option is turned on, every unsuccessful password change will be
  498. logged   to  the  file  'MultiUser.log'  in  the  configuration  directory.
  499. Defaults to OFF.
  500.  
  501. 5.9. LOGCHECKPASSWD
  502.  
  503.   If  this  option  is  turned on, every successful password check (see the
  504. library   function   muCheckPasswd())   will   be   logged   to   the  file
  505. 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  506.  
  507.  
  508. 5.10. LOGCHECKPASSWDFAIL
  509.  
  510.   If  this  option is turned on, every unsuccessful password check (see the
  511. library   function   muCheckPasswd())   will   be   logged   to   the  file
  512. 'MultiUser.log' in the configuration directory.  Defaults to OFF.
  513.  
  514.  
  515. 5.11. PASSWDUIDLEVEL
  516.  
  517.   Users  with  a  user identifier greater or equal than the specified value
  518. are  allowed  to  change  their  passwords.   Specify  a value in the range
  519. 0..65535.   E.g.   if  you  specify  a value of 2, a guest user with a user
  520. identifier  of  1  cannot  change  his  password,  unless his primary group
  521. identifier  is  greater  than  the  PASSWDGIDLEVEL.   See  also  the option
  522. PASSWDGIDLEVEL.  Defaults to 0.
  523.  
  524.  
  525. 5.12. PASSWDGIDLEVEL
  526.  
  527.   Users with a primary group identifier greater or equal than the specified
  528. value  are allowed to change their passwords.  Specify a value in the range
  529. 0..65535.   E.g.   if  you specify a value of 1, all users in a guest group
  530. with  a primary group identifier of 0 cannot change their passwords, unless
  531. their  user  identifiers are greater than the PASSWDUIDLEVEL.  See also the
  532. option PASSWDUIDLEVEL.  Defaults to 0.
  533.  
  534.  
  535.  
  536. 6. The group file
  537.  
  538.   The group file contains more information about the groups and defines the
  539. secondary  groups  a  user  belongs to, and thus allows a user to belong to
  540. more  than  one group.  This file (named 'MultiUser.group') must be located
  541. in  the  CONFIGDIR directory, as specified with the 'MakeKeyFiles' command.
  542. This file exists out of two parts, separated by a blank line.
  543.   Each  line  in  the  first  part  of the file contains information on one
  544. group.   Note however that not every group should have a line in this file,
  545. but at least one must have one.  The syntax of such a line is as follows:
  546.  
  547.                    <GroupID>|<gid>|<MgrUid>|<GroupName>
  548.  
  549. <GroupID>   is  the  short  name  of  the  group.  This name may be upto 31
  550.             characters long.
  551.  
  552. <gid>       is  the group identifier for this group, a number between 0 and
  553.             65535.
  554.  
  555. <MgrUid>    is  the  user identifier of this group's manager.  If the group
  556.             doesn't  have  a  manager,  you  should  specify  0.  It is not
  557.             necessary that a group's manager belongs to the group.
  558.  
  559. <GroupName> is  the  full  name  of  the  group.  This name may be upto 219
  560.             characters long.
  561.  
  562.   Each line in the second part of the file contains information on one user
  563. (there  may  exist more than one line for each user).  The syntax of such a
  564. line is as follows (max.  about 1024 characters):
  565.  
  566.                           <uid>:<gid>[,<gid>...]
  567.  
  568. <uid>     is the user identifier of a user.
  569.  
  570. <gid>     is  the  group  identifier of a secondary group to which the user
  571.           belongs.  It is NOT necessary to specify the primary group number
  572.           (as specified in the passwd file) as one of the secondary groups.
  573.  
  574.   A group file could look like this:
  575.  
  576.                        root|65535|65535|System
  577.                        dev|1|65535|Developers
  578.                        stud|2|2|Students
  579.                        guest|0|65535|Anonymous Guest
  580.  
  581.                        2:2,65535
  582.                        3:1
  583.  
  584.   If  there  are  bad lines in the group file, a warning will be posted and
  585. the  bad  line  will  be  ignored.   The  warning  requester will disappear
  586. automatically after 10 seconds if the user doesn't respond.
  587.  
  588.  
  589.  
  590. 7. Support Commands
  591.  
  592.   The  support commands are used to login to/logout from the system, change
  593. the  protection  bits  of  a  file,  change the owner of a file, change the
  594. default  protection  bits  for a group of tasks, ...  The number of support
  595. commands  may  grow  in  future  releases.   Here are the commands that are
  596. currently  supported.  They can only be executed from the shell or with the
  597. <Execute Command...> option of the Workbench.
  598.  
  599.  
  600. 7.1. Freeze
  601.  
  602.   This  command  freezes  a specified task.  You cannot freeze yourself nor
  603. the MultiUser.server.  This command can be used only by root.
  604.   See also the support commands 'Unfreeze' and 'Kill'.
  605.  
  606. Options ...
  607.  
  608. TCB       The  address  of  the  Task Control Block of the task you want to
  609.           freeze.   It can be both hexadecimal (preceeded with '$' or '0x')
  610.           or decimal.
  611.  
  612.  
  613. 7.2. Kill
  614.  
  615.   This command tries to cancel a specified task.  You cannot commit suicide
  616. nor kill the MultiUser.server.  This command can be used only by root.
  617.   WARNING:   Due  to  the  nature  of  AmigaOS,  killing  a  task is a very
  618. dangerous action!  Use it at your own risk!  Freezing a task is much safer.
  619.   See also the support commands 'Freeze' and 'Unfreeze'.
  620.  
  621. Options ...
  622.  
  623. TCB       The  address  of  the  Task Control Block of the task you want to
  624.           cancel.   It can be both hexadecimal (preceeded with '$' or '0x')
  625.           or decimal.  This task may be frozen.
  626.  
  627.  
  628. 7.3. LimitDOSSetProtection
  629.  
  630.   This  command defines whether the protection bits for GROUP and OTHER may
  631. be  changed  via  the  dos.library/SetProtection()  call.  It's very useful
  632. because  a lot of programs change the protection bits without knowing about
  633. bits for GROUP and OTHER.  See also the option LIMITDOSSETPROTECTION in the
  634. configuration file.
  635.  
  636. Options ...
  637.  
  638. ON        Turn the limitation on.  This means the protection bits for GROUP
  639.           and    OTHER    no    longer    can    be    changed   with   the
  640.           dos.library/SetProtection() call.  Of course you can still change
  641.           the protection bits for GROUP and OTHER with the MProtect command
  642.           (or with the library call muSetProtection()).
  643.  
  644. OFF       Turn the limitation off.
  645.  
  646.  
  647. 7.4. Login
  648.  
  649.   This  command  will  put  a  new owner on top of the current owner of the
  650. task.   *IX users may think of this as the *IX su command.  The effect of a
  651. successful  login  can be reversed with the Logout command.  The owner-list
  652. of a task is sort of a stack:  with Login you put a new owner on top of the
  653. stack,  with  Logout,  you  take an owner of the stack (unless the stack is
  654. empty).
  655.  
  656. Options ...
  657.  
  658. USERID    Login as this user.
  659.  
  660. GUI       Normally  the  login  prompt appears in the shell-window that was
  661.           used  to  execute  Login,  but  if  this  option  is specified, a
  662.           requester is used.
  663.  
  664. TASK      Login  another  task  than the one we're currently working in.  A
  665.           task  name  should  be specified after the TASK keyword.  You can
  666.           only login tasks which you own (unless you are root)!
  667.  
  668. OWN       Login  another  task  than  the one we're currently working in by
  669.           changing it's owner to the owner of the current task.  This works
  670.           only  with  tasks that are owned by nobody (unless you are root)!
  671.           This option must be used in conjunction with the TASK option.
  672.  
  673. GLOBAL    Login  all  tasks  connected  to  the  current  task.  It's a bit
  674.           difficult to explain what connected means, but you could say that
  675.           a  parent  task  and all its children are connected unless one of
  676.           them was logged in/out without the GLOBAL option.
  677.  
  678. PROCESS   Login  another  process than the one you're currently working in.
  679.           A  process  number (as displayed by the Status command) should be
  680.           specified   after  the  PROCESS  keyword.   You  can  only  login
  681.           processes which you own (unless you are root)!
  682.  
  683.  
  684. 7.5. Logout
  685.  
  686.   This  command  is  the  inverse  of  Login  if the stack of owners of the
  687. current  task  isn't  empty.   If the stack is empty or becomes empty after
  688. executing the Logout command, a login prompt will appear.  After login, the
  689. current  directory  will  be  changed  to  the  user's  home-directory, and
  690. depending  on  your  configuration  settings,  the '.profile' script in the
  691. configuration directory may be executed.
  692.  
  693. Options ...
  694.  
  695. GUI       If  a  login  request  is  generated  by  Logout, should it use a
  696.           requester?
  697.  
  698. TASK      See Login
  699.  
  700. GLOBAL    This  option  only works when the owner stack is or becomes empty
  701.           when  executing  the Logout command.  If this option is specified
  702.           in such a case, not only this task will change its owner, but all
  703.           connected  task  as  well.   It's a bit difficult to explain what
  704.           connected means, but you could say that a parent task and all its
  705.           children  are connected unless one of them was logged out without
  706.           the  GLOBAL  option.   It's  very useful to logout all your tasks
  707.           from your current session.
  708.  
  709. QUIET     Tells  logout  never  to  generate a login request.  If the owner
  710.           stack  becomes  empty,  you  will  simply be logged in as nobody.
  711.           This may be removed in future releases, but since it isn't really
  712.           useful, this shouldn't be a problem.
  713.  
  714. PROCESS   See Login
  715.  
  716. ALL       Remove  all  users  from  the  stack  of owners.  Specifying this
  717.           option  has  the  same  effect  as using 'Logout' until you get a
  718.           login request.
  719.  
  720.  
  721. 7.6. MakeKeyfiles
  722.  
  723.   This command creates the Keyfiles.  Every partitions you want to use with
  724. the  MultiUserFileSystem  must have a Keyfile ('.MultiUser.keyfile') in its
  725. root  directory.  If one of them is missing or inconsistent, all tasks will
  726. be  owned  by nobody to prevent unprivileged accesses, and an alert will be
  727. posted!
  728.   Do  NOT  forget  to  make  a  backup of all Keyfiles, in case an accident
  729. occurs!
  730.  
  731. Options ...
  732.  
  733. PASSWDDIR The directory where you've put the password file.  This directory
  734.           must be on one of the protected partitions.
  735.  
  736. CONFIGDIR The  directory where you've put the configuration and group file.
  737.           This directory must be on one of the protected partitions.
  738.  
  739. VOLUME    The list of partitions you want to protect.
  740.  
  741.  
  742. 7.7. MAssign
  743.  
  744.   This  command  lets  you create non-binding assigns (i.e.  assigns which are
  745. evaluated  each  time  you use them) for a template path.  You should start it
  746. from  a  shell  using  'Run'  (since  MAssign  won't  return until you send an
  747. ACTION_DIE  DosPacket)  and may want to redirect it's output to NIL:.  MAssign
  748. must  be  run  by  root,  so change its owner to root and set its 'U'-bit (see
  749. MProtect).
  750.  
  751. Options ...
  752.  
  753. NAME      The  logical device name for the assignment to create.  It should
  754.           end  with  a  colon  (':').   This  name will show up in ReqTools
  755.           requesters  too,  but unfortunately not in asl requesters, so use
  756.           RTPatch (© Nico François)!
  757.  
  758. TARGET    Template   path  for  the  assignment.   It  may  contain  option
  759.           specifiers  which  are  replaced  by  a string - depending on the
  760.           calling user - on every usage.
  761.  
  762.             %u  UserId of the calling user
  763.  
  764.             %h  Home directory of the calling user
  765.  
  766.             %g  GroupID of the calling user
  767.  
  768.             %%  %
  769.  
  770. VOLUME    Create  a  volume  node for this assign so an icon will appear on
  771.           the Workbench.
  772.  
  773. CREATE    Create the TARGET directory if it doesn't exist on access.
  774.  
  775. E.g.  after the command
  776.  
  777.                       Run >NIL: MAssign HOME: %h VOLUME
  778.  
  779. every  user  can refer to his/her home directory simply by using HOME:.  If
  780. you  want  a  separate  ENVARC:   directory  for every user you can use the
  781. following two commands:
  782.  
  783.                               Assign ENVARC:
  784.                Run >NIL: MAssign ENVARC: %h/Env-Archive CREATE
  785.  
  786. This  technique can easily be extended to ENV:, S:, MAIL:, ...  The 'Assign
  787. ...   DISMOUNT'  is  only necessary if you want to redefine an assign which
  788. already exists.
  789.  
  790.  
  791. 7.8. MList
  792.  
  793.   This is a simple list replacement.  It takes none, one or more path-names
  794. as  parameters  and  lists  the  files  in  those path(s) or in the current
  795. directory if no path-name was specified, together with all their protection
  796. bits and some other info.  It recognizes the new 'U' protection bit.
  797.  
  798. Options ...
  799.  
  800. DIR       The pathname(s) or the directory(s) you want information on.  The
  801.           standard AmigaDOS wildcards may be used here.
  802.  
  803. GROUPS    Display the GroupIDs for the files.
  804.  
  805.  
  806. 7.9. MProtect
  807.  
  808.   This command changes the protection flags for files or directories.
  809.  
  810. Options ...
  811.  
  812. FILE      The file or directory you want to change the protection flags of.
  813.           The standard AmigaDOS wildcards may be used here.
  814.  
  815. FLAGS     The protection flags used for the owner of the file.  Valid flags
  816.           are none or some out of:
  817.  
  818.             U   Set  uid  bit:   during  execution, change the owner of the
  819.                 process  (i.e.   the  uid and gid) to the owner of the file
  820.                 (cfr.   *IX).   This  even  works  if  you make the program
  821.                 resident.     However,    this   only   works   after   the
  822.                 multiuser.library   has   been  initialised.   If  you  put
  823.                 programs  with  the 'U' bit on in your S:User-Startup, make
  824.                 sure  you  do  it after the 'Logout GLOBAL' command, or put
  825.                 'UserInfo  <>NIL:'  before  the first of them to assure the
  826.                 library  has  been loaded!  If you set the 'U' bit together
  827.                 with 'GROUP W' or 'OTHER W', you will get a warning because
  828.                 this is a very dangerous situation :-)
  829.  
  830.             S   Script bit:  file is a shell script.
  831.  
  832.             P   Pure bit:  program is reentrant and reexecutable.
  833.  
  834.             A   Archive bit:  file has been backed up or archived.
  835.  
  836.             R   Read bit:  file is readable.
  837.  
  838.             W   Write bit:  file is writable.
  839.  
  840.             E   Execute bit:  file is executable.
  841.  
  842.             D   Delete bit:  file is deletable.
  843.  
  844. GROUP     The  protection  flags  used  for  users in the same group as the
  845.           owner  of the file.  Specify them after the GROUP keyword.  Valid
  846.           flags are none or some out of 'R', 'W', 'E' and 'D'.
  847.  
  848. OTHER     The  protection  flags  used for users outside the owner's group.
  849.           Specify  them  after  the OTHER keyword.  Valid flags are none or
  850.           some out of 'R', 'W', 'E' and 'D'.
  851.  
  852. ADD       Add  all specified protection flags to the flags that are already
  853.           set.
  854.  
  855. SUB       Subtract  all  specified protection flags from the flags that are
  856.           already set.
  857.  
  858. ALL       Recursively  scan  all  directories  from  within  the  specified
  859.           directory and process all found files and directories.
  860.  
  861. QUIET     Process silently, but do report errors.
  862.  
  863.  
  864. 7.10. Passwd
  865.  
  866.   The  Passwd  command is used to change your password.  Simply type in the
  867. command  in  the  shell and you will be prompted to enter your old password
  868. and type your new password twice.  If you did this correctly, your password
  869. will be changed!
  870.  
  871. Options ...
  872.  
  873. GUI       If this option is specified, Passwd uses requesters to prompt for
  874.           your passwords instead of simple console I/O.
  875.  
  876.  
  877. 7.11. RunCommand
  878.   The RunCommand command lets you execute a set uid program (a program with
  879. the 'U'-bit set and thus want to change it's owner during execution) from a
  880. shell  that  does  not  use  Create[New]Proc()  or  RunCommand() to execute
  881. commands (e.g.  WShell).  If you don't have such a shell or you do not want
  882. to use the set uid feature, you won't need this utility.
  883.  
  884. Options ...
  885.  
  886. COMMAND   The program you want to execute.
  887.  
  888. ARGS      The arguments for the program.
  889.  
  890.  
  891. 7.12. SetDefProtect
  892.  
  893.   This commands sets the default protection bits for the current task.
  894.  
  895. Options ...
  896.  
  897. FLAGS     The  protection  flags  used  for  the  owner  of  the file.  See
  898.           MProtect ('U' is not valid here).
  899.  
  900. GROUP     The  protection  flags  used  for  users in the same group as the
  901.           owner  of  the  file.  Specify them after the GROUP keyword.  See
  902.           MProtect.
  903.  
  904. OTHER     The  protection  flags  used for users outside the owner's group.
  905.           Specify them after the OTHER keyword.  See MProtect.
  906.  
  907. GLOBAL    Change the default protection bits not only for the current task,
  908.           but for all tasks on the same level.
  909.  
  910.  
  911. 7.13. SetOwner
  912.  
  913.   This  command is used to change the owner of a file.  You can only change
  914. the  owner  of  files  you own or of files that are owned by nobody, unless
  915. you're  root.   If you don't have Kickstart 39.xx or higher, you should use
  916. SetOwner37 instead of SetOwner!
  917.  
  918. Options ...
  919.  
  920. FILE      The  file  or  directory  you  want  to change the owner of.  The
  921.           standard AmigaDOS wildcards may be used here.
  922.  
  923. USER      The  UserID  of the user that should become the owner of the file
  924.           or  directory.   If  no user is specified, the current task owner
  925.           will  be taken.  You're not allowed to change the owner of a file
  926.           to someone else than yourself or nobody, unless you're root.
  927.  
  928. GROUP     The GroupID of the group for the file or directory owner.  If you
  929.           don't  specify any group, the user's primary group will be taken.
  930.           Of  course  you  must  specify a group you belongs to (i.e.  your
  931.           primary  group  or  one  of your secondary groups), unless you're
  932.           root.
  933.  
  934. NOBODY    Set the owner of the file or directory to nobody.
  935.  
  936. ALL       Recursively  scan  all  directories  from  within  the  specified
  937.           directory and process all found files and directories.
  938.  
  939. QUIET     Process silently, but do report errors.
  940.  
  941.  
  942. 7.14. Tasks
  943.  
  944.   This command lists the active tasks of a user.
  945.  
  946. Options ...
  947.  
  948. USERID    List  the  active  tasks  of  the specified user.  Default is the
  949.           current user.
  950.  
  951. ALL       List all active tasks.
  952.  
  953.  
  954. 7.15. Unfreeze
  955.  
  956.   This  command  unfreezes a task you have frozen before.  This command can
  957. be used only by root.
  958.   See also the support commands 'Freeze' and 'Kill'.
  959.  
  960. Options ...
  961.  
  962. TCB       The  address  of  the  Task Control Block of the task you want to
  963.           unfreeze.   It  can  be  both  hexadecimal (preceeded with '$' or
  964.           '0x') or decimal.
  965.  
  966.  
  967. 7.16. UserInfo
  968.  
  969.   This  command  can  be  used to get some information on the users of this
  970. system.   It  will  display  the  UserID  and  uid,  GroupID and gid, name,
  971. home-directory,  lastlogin  date  and  the contents of a '.plan' file if it
  972. exists in the home-directory of the appropriate user.
  973.  
  974. Options ...
  975.  
  976. USERID    Give  information  on  the  user  with the specified UserID.  The
  977.           UserID  is  the  name  you  have to enter at a login prompt.  The
  978.           standard  AmigaDOS  wildcards  may  be used here.  Default is the
  979.           current user.
  980.  
  981. UID       Same  as USERID, but this time information on the user whose user
  982.           ID  is  specified  is listed.  The user ID is the number given as
  983.           second  entry  in  the passwd file.  Specify the userid after the
  984.           UID keyword.
  985.  
  986. GID       Same  thing as UID, but this time for all users in the group with
  987.           the  specified  group  ID.   Specify  the  group ID after the GID
  988.           keyword.
  989.  
  990. NAME      Gives  information  on  the  user  with  the specified real name.
  991.           Specify  the  name after the NAME keyword.  The standard AmigaDOS
  992.           wildcards may be used here.
  993.  
  994. GROUPID   Gives  information  on  all  the  users  in  the  group  with the
  995.           specified   GroupID.   Specify  the  GroupID  after  the  GROUPID
  996.           keyword.
  997.  
  998. GROUPNAME Gives  information  on  all  the  users  in  the  group  with the
  999.           specified Group Name.  Specify the Group Name after the GROUPNAME
  1000.           keyword.
  1001.  
  1002. ALL       Give information on all the users of this system.  This means all
  1003.           users listed in the passwd file.
  1004.  
  1005. QUICK     If  you  add  this  option, only the UserID(s) will be displayed.
  1006.           This  is  very  useful  for scripts and aliases.  E.g.  after the
  1007.           alias definition
  1008.  
  1009.                     Alias HCD CD SYS:Homes/*`UserInfo QUICK []*`
  1010.  
  1011.           the  command  'HCD  guest'  will  change the current directory to
  1012.           guest's   home   directory,   supposed  all  your  users  have  a
  1013.           home-directory in SYS:Homes.
  1014.  
  1015. GROUPS    If  you  add  this option, the secondary groups a user belongs to
  1016.           will be displayed too.
  1017.  
  1018.  
  1019. 7.17. Who
  1020.  
  1021.   This  command  lists the names and UserIDs of all users who are logged in
  1022. currently.
  1023.  
  1024. Options ...
  1025.  
  1026. AM I      Display only the name and UserID of the current user.
  1027.  
  1028. QUICK     If you add this option, only the UserID(s) will be displayed.
  1029.  
  1030.  
  1031.  
  1032. 8. The log file
  1033.  
  1034.   Depending  on your configuration file, some actions will be logged to the
  1035. file  'MultiUser.log'  in your configuration directory.  The following kind
  1036. of  entries may appear therein (<user> stands for a user represented by his
  1037. user identifier, <userid> stands for a user represented by his UserID):
  1038.  
  1039.   o <date>, <time>: Startup
  1040.  
  1041.     MultiUser startup on <date>, <time>.
  1042.  
  1043.   o <date>, <time>: Login from <user> to <UserID>
  1044.  
  1045.     <UserID>  was  logged in from a task owned by <user> on <date>, <time>.
  1046.     <user> will be '0000' if the Logout command was used instead of Login.
  1047.  
  1048.   o <date>, <time>: Login from <user> to <UserID> failed
  1049.  
  1050.     <UserID> failed to login from a task owned by <user> on <date>, <time>.
  1051.     <user>  will be '0000' if the Logout command was used instead of Login.
  1052.     This  may  indicate an attempt of <user> to do an unauthorized login on
  1053.     the account of <UserID>!
  1054.  
  1055.   o <date>, <time>: Passwd for <user>
  1056.  
  1057.     <user> changed his password on <date>, <time>.
  1058.  
  1059.   o <date>, <time>: Passwd for <user> failed
  1060.  
  1061.     <user> failed to change his password on <date>, <time>.
  1062.  
  1063.   o <date>, <time>: CheckPasswd for <user>
  1064.  
  1065.     The  password  check  ((see  the  library  function muCheckPasswd()) on
  1066.     <date>, <time> for <user> was successful.
  1067.  
  1068.   o <date>, <time>: CheckPasswd for <user> failed
  1069.  
  1070.     The  password  check  ((see  the  library  function muCheckPasswd()) on
  1071.     <date>,  <time>  for  <user>  was  unsuccessful.   This may indicate an
  1072.     attempt  of an unknown person to make unauthorizedly use of the account
  1073.     of <user>!
  1074.  
  1075.  
  1076.  
  1077. 9. Caveats
  1078.  
  1079.   o Unlike  the FastFileSystem, the MultiUserFileSystem returns an error on
  1080.     illegal lock modes (i.e.  anything else than ACCESS_READ/SHARED_LOCK or
  1081.     ACCESS_WRITE/EXCLUSIVE_LOCK).    This   has   been   done   for  future
  1082.     compatibility  reasons.   However,  some  programs do pass illegal lock
  1083.     modes - which is a violation of the Amiga rules - and thus will fail to
  1084.     work.
  1085.  
  1086.   o The  .profile  will not be executed under Csh because Csh is not a real
  1087.     (Amiga) shell but rather an interactive program.
  1088.  
  1089.   o Csh  expands wild cards by itself, so quote them (e.g.  "*") if you use
  1090.     the support commands.
  1091.  
  1092.   o Do  not  try  to  use  the MultiUserFileSystem on floppy disks or other
  1093.     removables  (unless  you  want  to  create  an  emergency  boot disk as
  1094.     explained  in the appropriate documentation)!  Although it is possible,
  1095.     you  will almost always get in trouble with the Keyfiles.  Keeping your
  1096.     floppies in a safe place is still the best protection!
  1097.  
  1098.   o ARexx  programs  are  always  executed  under the same ownership as the
  1099.     RexxMaster  task  -  which  is  started by RexxMast -, so make sure the
  1100.     RexxMast  command  is  executed  by  NOBODY  (i.e.   before  the  first
  1101.     Login/Logout command) and do not set the set uid bit for RexxMast!
  1102.  
  1103.   o The protection bits for a directory are not used to check if a user has
  1104.     access  to  objects  in  the directory.  They do are used to check if a
  1105.     user  can Lock() the directory, so you can't CD to a directory you have
  1106.     no access to.
  1107.  
  1108.   o If gzip complains
  1109.  
  1110.              <file> is not a directory or a regular file - ignored
  1111.  
  1112.     just  use 'MProtect <file> RWED' to clear the protection bits for GROUP
  1113.     and OTHER.  Gzip doesn't like them!
  1114.  
  1115.  
  1116.  
  1117. 10. External utilities
  1118.  
  1119.   The  Extern  archive  contains utilities written by other programmers who
  1120. allowed  me  to  distribute them with the MultiUser package.  Some may have
  1121. the  source  included, other not.  For more information about their usages,
  1122. disclaimers,   distributability   and   copyright  notices,  refer  to  the
  1123. appropriate documentation.
  1124.  
  1125.   Currently the following external utilities are included:
  1126.  
  1127.   o Amilock 1.0.1 by Michael Nielsen (cemn@manta.jcu.edu.au)
  1128.  
  1129.   o DICElib by Fabian Nuñez (fnunez@cs.uct.ac.za)
  1130.  
  1131.   o DosWedge 1.1 by David Swasbrook (swaz@iconz.co.nz)
  1132.  
  1133.   o ExamPatch 1.0 by Todd Vierling (Todd.Vierling@f46.n371.z1.fidonet.org)
  1134.  
  1135.   o Fingerd 0.1 by Marco Ciuchini (CIUCHINI@roma1.infn.it)
  1136.  
  1137.   o MInfo 1.01 by Matt Francis (m.p.francis@newcastle.ac.uk)
  1138.  
  1139.   o MLock 1.01 by Matt Francis (m.p.francis@newcastle.ac.uk)
  1140.  
  1141.   o Modula by Frank J. Beckmann (infjb@sun.rz.tu-clausthal.de)
  1142.  
  1143.   o muFSinc by Norbert Püschel (nobbi@zaphod.rhein.de)
  1144.  
  1145.   o MuMu 1.0 by Litrik De Roy (FidoNet 2:292/603.61)
  1146.  
  1147.   o NetmuFS 1.1 by Norbert Püschel (nobbi@zaphod.rhein.de)
  1148.  
  1149.   o UserID 39.14 by Fabian Nuñez (fnunez@cs.uct.ac.za)
  1150.  
  1151.   If  you  write an interesting piece of software you want me to distribute
  1152. as  an  external  utility,  please  send  it  to  me and I'll add it to the
  1153. package.
  1154.  
  1155.  
  1156.  
  1157. 11. Other software supporting MultiUser
  1158.  
  1159.   o AlertPatch V3.0 by David Swasbrook (swaz@iconz.co.nz)
  1160.  
  1161.   o AmiTCP 2.3 by the AmiTCP/IP Group (amitcp-group@hut.fi)
  1162.  
  1163.   o Newlist8: 'ls' clone by Phil Dietz (pdietz@cse.unl.edu)
  1164.  
  1165.   o ReOrg V3.1: disk optimizer by Holger Kruse (kruse@cs.ucf.edu)
  1166.  
  1167.   o SwazInfo by David Swasbrook (swaz@iconz.co.nz)
  1168.  
  1169.   o Tnserv: telnet daemon for AmiTCP by Steve Holland (sdh4@cornell.edu)
  1170.  
  1171.   If  you  write  an interesting piece of software that supports MultiUser,
  1172. please let me know and I'll add it to the list above.
  1173.  
  1174.  
  1175.  
  1176. 12. History
  1177.  
  1178. Release 1.0ß (Library Version 39.134)
  1179.  
  1180.   First  public release of MultiUser.  All the work on this one was done by
  1181. Geert Uytterhoeven.
  1182.  
  1183.  
  1184. Internal Release (Library Version 39.135)
  1185.  
  1186.   Update  of  the  library and the support programs to allow global logging
  1187. out.  (Kurt Haenen)
  1188.  
  1189.   o The way the library manages the linking of tasks and owners was changed
  1190.     to  allow a kind of global control over all tasks of a single user.  It
  1191.     still isn't quite the way I'd like it, but it's getting closer ...
  1192.  
  1193.   o The  GLOBAL option was added to the Logout command to allow the user to
  1194.     logout  all  tasks  connected to the same tasknode (private structure).
  1195.     This  means  that  you  can logout/login a task and all its children by
  1196.     executing a LOGOUT GLOBAL command from one of them.  Very useful 'cause
  1197.     now you can logout the Workbench without having to quit it ...
  1198.  
  1199.   o TASK  option  added  to  Login  and Logout to allow you to Login/Logout
  1200.     another  task  (of which you are the owner or that's owned by nobody or
  1201.     whatever task if you are root).
  1202.  
  1203.   o QUIET option added to Logout to force Logout so that nobody will become
  1204.     owner  of  the task.  We're still discussing this, so it may be removed
  1205.     again in the future ...
  1206.  
  1207.  
  1208. Internal Release (Library Version 39.136)
  1209.  
  1210.   Update  of  the file system, library and support programs so that default
  1211. protection  bits  can  be  set  and  are  used  by the file system.  (Geert
  1212. Uytterhoeven)
  1213.  
  1214.   o The  file  system  and  library  were  updated to keep track of default
  1215.     protection bits and to use them whenever a file is created.
  1216.  
  1217.   o A  new  utility SetDefProtect (name may change in the future) was added
  1218.     to  allow  the  user  to  specify  the  default  protection  bits for a
  1219.     tasknode.
  1220.  
  1221.  
  1222. Release 1.1 (Library Version 39.137)
  1223.  
  1224.   Update  of  the  library  to  support  .profiles  and allow hiding of the
  1225. password  on  any  terminal (I hope)!  Update to the file system to support
  1226. protection of files against locking.  (Geert Uytterhoeven and Kurt Haenen)
  1227.  
  1228.   o The Logout command now also executes a .profile script after login.
  1229.  
  1230.   o An  exclusive  lock  can  only  be  taken on a file you have write-, or
  1231.     delete-rights  on.   A  shared  lock can be obtained on a file you have
  1232.     read-, write-, execute- or delete-rights on or that's owned by you.
  1233.  
  1234.   o The  UserInfo command can now display the .sig file located in the home
  1235.     of  the  user  on which info is demanded.  To do this, you have to give
  1236.     the  SIG  option.   The .sig file should be readable for the one asking
  1237.     information about the owner of the .sig!
  1238.  
  1239.  
  1240. Release 1.2 (Library Version 39.140)
  1241.  
  1242.   Starting with this release, all the work was done by Geert Uytterhoeven.
  1243.  
  1244.   o The  password  file  should  be compatible with the TCP/IP package from
  1245.     Commdore (AS225) (I hope :-).
  1246.  
  1247.   o Wildcards added in some support commands.
  1248.  
  1249.   o If  a  user  doesn't  have  a password he won't be asked for it no more
  1250.     during Login/Logout.
  1251.  
  1252.   o Finally:  autodoc and includes added!!
  1253.  
  1254.   o .sig renamed to .plan. SIG option renamed to PLAN.
  1255.  
  1256.   o PURE  bit set for the support commands.  They were also pure in earlier
  1257.     releases, but I forgot the magic bit.
  1258.  
  1259.   o Some other minor changes I can't remember :-)
  1260.  
  1261.  
  1262. Release 1.2a (Library Version 39.141)
  1263.  
  1264.   Only some bug fixes :-(
  1265.  
  1266.   o SetOwner37: opened wrong dos.library version.
  1267.  
  1268.   o Setowner[37]: crashed when bad operating system version.
  1269.  
  1270.   o Password  encryption  still  wasn't compatible with AS225 because of an
  1271.     ambiguity  in the ACrypt() documentation (I passed the UserName instead
  1272.     of the UserID).
  1273.  
  1274.  
  1275. Release 1.3 (11/05/93) (Library Version 39.145)
  1276.  
  1277.   WARNING: THIS  IS  A  MAJOR  UPDATE  WITH SOME FUNDAMENTAL CHANGES!!  YOU
  1278.            SHOULD   CHECK   YOUR  OWN  MULTIUSER  APPLICATION  SOURCES  AND
  1279.            RECOMPILE THEM!!
  1280.  
  1281.   o Using  history  after  changing  the  password from the console doesn't
  1282.     reveal the entered passwords anymore.
  1283.  
  1284.   o Bug  fixed:  If you used Passwd before IPrefs installed localization or
  1285.     in  case  of  a  pre-2.1 Workbench, a corrupt password file was written
  1286.     (RawDoFmt()  patched  by  locale.library  treats  %u different than the
  1287.     original).
  1288.  
  1289.   o New less kludgy, object oriented internal structure.
  1290.  
  1291.   o Meaning  of  tag  muT_Task  changed.   Now it needs a pointer to a task
  1292.     structure rather than the task's name.
  1293.  
  1294.   o Library function muSetDefProtection() renamed to muSetDefProtectionA():
  1295.     its  arguments  are now passed via a taglist using the tag muT_Task and
  1296.     the new tag muT_DefProtection.
  1297.  
  1298.   o If you're already root you won't be asked for a password anymore during
  1299.     Login.
  1300.  
  1301.   o GLOBAL flag added to SetDefProtect.
  1302.  
  1303.   o PROCESS keyword added for Login/Logout.
  1304.  
  1305.   o New tags muT_UserID and muT_Password added for muLoginA().
  1306.  
  1307.   o You  aren't  allowed  anymore  to change the owner of a file to someone
  1308.     else than yourself or nobody, unless you're root.
  1309.  
  1310.   o Owner change during execution (set uid bit, cfr.  *IX) added.
  1311.  
  1312.   o Source  of  support  commands  added as examples.  They are full public
  1313.     domain.   If you develop your own support commands I'd appreciate it if
  1314.     you  would  send  me  a  copy (eventually a copy of the source too :-).
  1315.     Maybe I could add them to the next release of the package.
  1316.  
  1317.   o From  now  on the MultiUserFileSystem is distributed as a patch for the
  1318.     original FastFileSystem.
  1319.  
  1320.   o New support command Tasks.
  1321.  
  1322.   o New  library functions muSetProtection() and muLimitDOSSetProtection().
  1323.     New support command LimitDOSSetProtection.
  1324.  
  1325.  
  1326. Release 1.4 (20/07/93) (Library Version 39.151)
  1327.  
  1328.   o Logout QUIET was broken: fixed!
  1329.  
  1330.   o If  the  password file is corrupt, you will get a warning instead of an
  1331.     inaccessible system.  All invalid lines will be ignored.
  1332.  
  1333.   o The ramlib task isn't owned by root anymore.
  1334.  
  1335.   o UserInfo entered an endless loop if a .plan was read protected:  fixed!
  1336.  
  1337.   o SetOwner37 caused a (harmless) Enforcer hit (thanks Max):  fixed!
  1338.  
  1339.   o New        keytypes       muKeyType_WUserID,       muKeyType_WUserName,
  1340.     muKeyType_WUserIDNext  and  muKeyType_WUserNameNext for muGetUserInfo()
  1341.     to handle wildcards in a UserID or UserName.
  1342.  
  1343.   o UserInfo uses the new keytypes and thus allows wildcards for UserID and
  1344.     UserName.
  1345.  
  1346.   o New library function muCheckPasswd().
  1347.  
  1348.   o The MultiUser.server doesn't spawn AmigaDOS-requesters anymore.
  1349.  
  1350.   o The  support  commands  MList,  MProtect  and  SetOwner[37]  now handle
  1351.     non-matching wildcards correctly and give the right error message.
  1352.  
  1353.   o Enhanced security using Keyfiles.
  1354.  
  1355.   o The (private) library function muSetLibFlush() is obsolete now.
  1356.  
  1357.   o Configuration file and log options added.
  1358.  
  1359.   o The .profile in the configuration directory will be executed (depending
  1360.     on  your  configuration settings), rather than the .profile in a user's
  1361.     home-directory.
  1362.  
  1363.   o New library functions muGetPasswdDirLock() and muGetConfigDirLock().
  1364.  
  1365.   o Patch for the FastFileSystem of AmigaOS Release 2.05 (V36.104) added.
  1366.  
  1367.   o QUICK flag added for UserInfo.
  1368.  
  1369.   o If  the user doesn't respond to a warning requester, the requester will
  1370.     disappear  automatically after 10 seconds to allow unattended operation
  1371.     in production environments.
  1372.  
  1373.   o Bug  fixed:   If you specify a nonexistent task name, Login/Logout TASK
  1374.     raises an error now instead of operating on the current task.
  1375.  
  1376.   o Security  hole  fixed:   now  set  uid  only works on volumes using the
  1377.     MultiUserFileSystem.
  1378.  
  1379.   o The .lastlogin file is human readable now (i.e. <Day> <Date> <Time>).
  1380.  
  1381.   o The  PLAN  flag  for UserInfo is obsolete now, UserInfo always displays
  1382.     the  contents  of  the  .plan file (unless you specify the QUICK flag).
  1383.     Now UserInfo displays the lastlogin date too.
  1384.  
  1385.   o Almost  all  of  Kurt's  code  is  gone now (I hope this won't start an
  1386.     AT&T/USL <-> BSD alike war :-).
  1387.  
  1388.   o Finally  Passwd looks fine when used from a Shell on a serial terminal:
  1389.     now  it dumps carriage returns where it should.  I still don't know why
  1390.     muLogin()/Logout()  always  worked  correctly  and  Passwd not (in both
  1391.     cases I used almost the same code!), but who cares??
  1392.  
  1393.  
  1394. Release 1.5 (14/10/93) (Library Version 39.157)
  1395.  
  1396.   o Patch for the FastFileSystem of AmigaOS Release 3.1 (V40.1) added.
  1397.  
  1398.   o Bug  fixed:   If  the  multiuser.library  hasn't been loaded yet or the
  1399.     owner  of  a  DosPacket can't be found, the default protection bits are
  1400.     now RWED GROUP R OTHER R instead of RWED.
  1401.  
  1402.   o New support command Who.
  1403.  
  1404.   o External utility UserID added.
  1405.  
  1406.   o Now  MultiUser works fine with programs using Soft Interrupts for their
  1407.     packet I/O, especially programs using ixemul.library (i.e.  gcc/g++ and
  1408.     programs compiled with gcc/g++).  Thanks Markus!
  1409.  
  1410.   o Bug  fixed:  If the LASTLOGINREQ option is turned off, Logout GUI won't
  1411.     output to a console window anymore.
  1412.  
  1413.   o Autodoc   bug   fixed:    muLogoutA()  executes  the  .profile  in  the
  1414.     configuration   directory  rather  than  the  .profile  in  the  user's
  1415.     home-directory.
  1416.  
  1417.   o New tag muT_All for muLogoutA(), new flag ALL for Logout.
  1418.  
  1419.   o The library functions muGetPasswdDirLock() and muGetConfigDirLock() are
  1420.     now callable by everybody instead of root only.
  1421.  
  1422.   o Partitions  formatted  under  the MultiUserFileSystem for more security
  1423.     (which results in a format equivalent to FFS INTL) can now be converted
  1424.     to any other MultiUserFileSystem equivalent of the standard file system
  1425.     (e.g.  OFS or FFS DC) using ReOrg 3.1.  Thanks Holger!
  1426.  
  1427.   o Group file added, new structure muGroupInfo, new according keytypes and
  1428.     new   library   functions   muAllocGroupInfo(),  muFreeGroupInfo()  and
  1429.     muGetGroupInfo().
  1430.  
  1431.   o New  flag GROUPS for MList, new flag GROUPS and new options GROUPID and
  1432.     GROUPNAME for UserInfo, new option GROUP for SetOwner and SetOwner37.
  1433.  
  1434.   o New structure muExtOwner, new library functions muGetTaskExtOwner() and
  1435.     muUserInfo2ExtOwner(), new macros muSecGroups() and muExtOwner2ULONG().
  1436.  
  1437.   o New library function muGetRelationshipA() for easier access control.
  1438.  
  1439.   o Bug  fixed:  If you called SetOwner(), SetProtection(), SetComment() or
  1440.     SetFileDate() too many times on files or directories you have no access
  1441.     to,  the  file  system  crashed.   This  bug appeared in all subsequent
  1442.     releases!
  1443.  
  1444.   o New   structures   muMonitor   and   muMonMsg,  new  library  functions
  1445.     muAddMonitor() and muRemMonitor() for system monitoring.
  1446.  
  1447.   o Minor changes in the format of the log file.
  1448.  
  1449.   o New support command MAssign.
  1450.  
  1451.   o Bug fixed:  the .lastlogin file wasn't recognized using some languages.
  1452.  
  1453.   o Installation method for Supra Wordsync controllers added.  Thanks René!
  1454.  
  1455.  
  1456. Release 1.6 (27/01/94) (Library Version 39.161)
  1457.  
  1458.   o muLoginA() with muT_UserID and without muT_Password is allowed now.
  1459.  
  1460.   o New option USERID for Login.
  1461.  
  1462.   o New  tag muT_NoLog for muLoginA(), for use in set uid daemons.  MAssign
  1463.     uses this new tag.  Thanks Bernhard!
  1464.  
  1465.   o The  maximum  Hostname  size is extended from 15 to 31 characters.  Now
  1466.     Hostname is truncated on the first period.
  1467.  
  1468.   o Login/Logout/Passwd GUI uses console I/O if the pr_WindowPtr is -1.
  1469.  
  1470.   o New  library  functions  muKill(),  muFreeze()  and  muUnfreeze().  New
  1471.     support commands Kill, Freeze and Unfreeze.
  1472.  
  1473.   o Some  bugs  fixed  in  MAssign  (thanks Ingolf), new options VOLUME and
  1474.     CREATE for MAssign (thanks Bernhard).
  1475.  
  1476.   o Source of the library added.
  1477.  
  1478.   o All memory allocations are pooled now.
  1479.  
  1480.   o Some  external  utilities  added, list of software supporting MultiUser
  1481.     extended.
  1482.  
  1483.   o Now  the  file system patches are applied using spatch (© Copyright SAS
  1484.     Institute, Inc.).
  1485.  
  1486.   o Emergency boot disk method added.  Thanks Ingolf!
  1487.  
  1488.   o New Shell field in the muUserInfo structure.  Thanks Thomas!
  1489.  
  1490.   o New  support  command RunCommand as a workaround for the WShell set uid
  1491.     problem.
  1492.  
  1493.  
  1494. Release 1.7 (07/03/94) (Library Version 39.164)
  1495.  
  1496.   o The LOG* flags in the config file didn't behave like they should.
  1497.  
  1498.   o Due to a synchronization problem the keyfiles could be declared invalid
  1499.     when they were valid.
  1500.  
  1501.   o Installation  method  for  Supra  Wordsync controllers removed since it
  1502.     seemed  to  contain  Workbench  files.   Sorry Commodore, never noticed
  1503.     it!
  1504.  
  1505.   o Sometimes Login reported a failure in case of succes.
  1506.  
  1507.   o Finally  logout  'till the root of the task tree creates a new tree.  I
  1508.     hope it will work like it should this time!
  1509.  
  1510.   o Some  external  utilities  added, list of software supporting MultiUser
  1511.     extended.
  1512.  
  1513.   o Some other small and harmless bugs fixed.
  1514.  
  1515.   o Package split in parts to reduce FTP bandwidth.
  1516.  
  1517.  
  1518.  
  1519. 13. Plans for the future
  1520.  
  1521.   o A redesign allowing POSIX compliancy.
  1522.  
  1523.   o The multiuser.library should be a part of the MultiUserFileSystem.
  1524.  
  1525.   o A 'safe' backdoor for emergency situations.
  1526.  
  1527.   o A  brand  new  File  System:  maybe the Berkeley Fast File System?  Any
  1528.     help is welcome!
  1529.  
  1530.  
  1531.  
  1532. 14. Credits
  1533.  
  1534.   o Library             :   Geert Uytterhoeven & Kurt Haenen
  1535.  
  1536.   o Support Commands    :   Geert Uytterhoeven & Kurt Haenen
  1537.  
  1538.   o Documentation       :   Geert Uytterhoeven & Kurt Haenen
  1539.  
  1540.   o File System Patches :   Geert Uytterhoeven
  1541.  
  1542.  
  1543.   Starting with Release 1.2, all the work was done by Geert Uytterhoeven.
  1544.  
  1545.  
  1546.  
  1547. 15. Contacts
  1548.  
  1549. How to contact the author ...
  1550.  
  1551.   o E-mail
  1552.  
  1553.                            uytterho@cs.kuleuven.ac.be
  1554.  
  1555.       This account is at least valid 'till end June '94.
  1556.  
  1557.  
  1558.   o Fax
  1559.  
  1560.                                   +32-16-535823
  1561.  
  1562.  
  1563.   o Snail mail
  1564.  
  1565.       - My home address
  1566.  
  1567.                                Geert Uytterhoeven
  1568.                                Huysmansstraat 12
  1569.                                B-3128 BAAL
  1570.                                BELGIUM
  1571.  
  1572.       - My study address (from October '93 'till end June '94)
  1573.  
  1574.                                Geert Uytterhoeven
  1575.                                Tervuursevest 119
  1576.                                B-3001 HEVERLEE
  1577.                                BELGIUM
  1578.  
  1579.  
  1580. How to contact the MultiUser mailing list ... (thanks Kai)
  1581.  
  1582.   Mail your comments to
  1583.  
  1584.                            mufs@hactar.hanse.de
  1585.  
  1586.   If you want to subscribe to this mailing list, just send an E-mail to
  1587.  
  1588.                          listserv@hactar.hanse.de
  1589.  
  1590. containing a line like this:
  1591.  
  1592.                             ADD <address> mufs
  1593.  
  1594. where  <address>  stands  for  your  E-mail address.  From then on you will
  1595. receive  a copy of all mails sent to the mailing list.  For more help about
  1596. the  mailing  list, send an E-mail containing only the magic word 'HELP' to
  1597. the list server (i.e. listserv@hactar.hanse.de).
  1598.  
  1599.  
  1600.  
  1601. 16. Special thanks go to ...
  1602.  
  1603.   o Nico François for developing ReqTools.
  1604.  
  1605.   o Jorrit  Tyberghein  for  developing the magnificent debugger PowerVisor
  1606.     (We're  still  waiting  for  release  1.43  :-),  from  which muKill(),
  1607.     muFreeze() and muUnfreeze() were derived.
  1608.  
  1609.   o SAS Institute, Inc. for spatch.
  1610.  
  1611.   o Kurt  Haenen,  Ives  Aerts,  Litrik  De  Roy and Nico François for beta
  1612.     testing.
  1613.  
  1614.   o Kai  'wusel'  Siering,  Markus  Illenseer, Tako Schotanus, Ralph-Thomas
  1615.     Aussem,  Max  Hantsch,  Markus  Wild,  Jason  Gouger,  René  Laederach,
  1616.     Bernhard  Seefeld,  Ingolf Koch and Thomas Holmstrom for their comments
  1617.     and/or tips.
  1618.  
  1619.   o The  Department  of  Computer  Science  at  the Katholieke Universiteit
  1620.     Leuven for allowing me to use the InterNet for this MultiUser project.
  1621.  
  1622.   o Kai 'wusel' Siering for setting up a mailing list for MultiUser.
  1623.  
  1624.   o Fabian  Nuñez, Michael Nielsen, Todd Vierling, Marco Ciuchini, Frank J.
  1625.     Beckmann, Matt Francis, Litrik De Roy and Norbert Püschel for supplying
  1626.     an external utility.
  1627.  
  1628.   o Holger  Kruse,  Phil  Dietz,  the AmiTCP/IP Group and Steve Holland for
  1629.     supporting MultiUser in their programs.
  1630.  
  1631.  
  1632.  
  1633.                                                     
  1634.                                          /   / /   /
  1635.                                         /   / /   /
  1636.                                        /   / /   /
  1637.                                       /   / /   /
  1638.                           \   \ \   \/   / /   /
  1639.                            \   \ \   \  / /   /
  1640.                             \   \ \   \/ /   /
  1641.                              \   \/\   \/   /
  1642.                               \   \ \   \  /
  1643.                                \   \/\   \/
  1644.  
  1645.  
  1646.                      Only Amiga makes it possible ...
  1647.  
  1648.                    But wouldn't Linux for Amiga be nice!
  1649.  
  1650.  
  1651.                                     /\
  1652.                                    /XX\
  1653.                                   /XXXX\
  1654.                                  /XXXXXX\
  1655.                                 /XXXXXXXX\
  1656.                              /\ \XXXXXXXX/ /\
  1657.                             /XX\ \XXXXXX/ /XX\
  1658.                            /XXXX\ \XXXX/ /XXXX\
  1659.                           /XXXXXX\ \XX/ /XXXXXX\
  1660.                          /XXXXXXXX\ \/ /XXXXXXXX\
  1661.                          \XXXXXXXX/ /\ \XXXXXXXX/
  1662.                           \XXXXXX/ /XX\ \XXXXXX/
  1663.                            \XXXX/ /XXXX\ \XXXX/
  1664.                             \XX/ /XXXXXX\ \XX/
  1665.                              \/ /XXXXXXXX\ \/
  1666.                                 \XXXXXXXX/
  1667.                                  \XXXXXX/
  1668.                                   \XXXX/
  1669.                                    \XX/
  1670.                                     \/
  1671.  
  1672.